home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
librarys
/
mklib.1
< prev
next >
Wrap
Text File
|
1989-02-01
|
78KB
|
2,009 lines
Path: xanth!ames!mailrus!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v89i006: mklib - make a .library file out of .c files
Message-ID: <11496@swan.ulowell.edu>
Date: 1 Feb 89 05:01:05 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 1998
Approved: page@swan.ulowell.edu
Submitted-by: hcr!hcrvax!edwin (Edwin Hoogerbeets)
Posting-number: Volume 89, Issue 6
Archive-name: libraries/mklib.1
I wanted to write my routines in C and not fiddle with the
assembler interface, etc. I decided to write mklib and keep my
fiddling with the assembler to this one session.
[uuencoded executable included. ..Bob]
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# ed.c
# makefile
# mklib.c
# mklib.h
# mklib.man
# mklib.uu
# readme
# t.c
# text.c
# This archive created: Mon Jan 30 17:11:16 1989
cat << \SHAR_EOF > ed.c
/* this is a test library */
#include <exec/types.h>
char myname[] = "mylib.library";
char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";
LONG GetDown()
{
return (77);
}
ULONG Double(arg)
ULONG arg;
{
return (2 * arg);
}
LONG Triple(arg)
LONG arg;
{
arg *= 3;
return ((LONG)arg);
}
LONG Add(apples,oranges)
LONG apples,oranges;
{
return(apples+oranges);
}
LONG Sum(a,b,c,d,e,f)
LONG a,b,c,d,e,f;
{
return(a+b+c+d+e+f);
}
SHAR_EOF
cat << \SHAR_EOF > makefile
# Mklib 1.0 - a source file generator for Amiga shared libraries
# copyright 1988 Edwin Hoogerbeets
#
# This software is freely redistributable as long as there is no charge
# beyond resonable copy fees and as long as this notice stays intact.
#
# Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
# program is lifted. Also thanks to Neil Katin for his mylib.asm upon
# which elib is based.
CFLAGS=-Z20000
OBJS=mklib.o text.o
mklib: $(OBJS)
ln $(OBJS) -led -lc -o mklib
SHAR_EOF
cat << \SHAR_EOF > mklib.c
/*
Mklib 1.0 - a source file generator for Amiga shared libraries
Compiled with Manx v3.6a small code model/16 bit int. (see makefile)
copyright 1988 Edwin Hoogerbeets
This software and the files it produces are freely redistributable
as long there is no charge beyond reasonable copy fees and as long
as this notice stays intact.
Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
program is lifted. Also thanks to Neil Katin for his mylib.asm upon
which elib is based.
*/
#include <stdio.h>
#include <ctype.h>
#include <edlib.h>
#include "mklib.h"
void error(msg)
char *msg;
{
fprintf(stderr,"Error: %s\n",msg);
exit(1);
}
void writeto(file,header)
FILE *file;
char *header[];
{
int index = 0;
while ( header[index] != NULL )
fprintf(file,"%s\n",header[index++]);
}
/* init opens and initializes all the output files */
void init()
{
/* open file with startup code */
if ( (startup = fopen("startup.asm","w")) == NULL )
error("Could not open startup code file");
/* write the header and the body to the file */
writeto(startup,asmheader);
writeto(startup,startupcode);
/* we are finished with the startup code file */
fclose(startup);
/* open romtag file */
if ( (romtag = fopen("rtag.asm","w")) == NULL )
error("Could not open romtag file");
/* write the header and the romtag info */
writeto(romtag,asmheader);
writeto(romtag,rtag);
/* we are finished with this one too */
fclose(romtag);
/* open library include file */
if ( (inc = fopen("lib.h","w")) == NULL )
error("Could not open library include file");
/* write the header and the info */
writeto(inc,cheader);
writeto(inc,incbody);
/* we are finished with this one too */
fclose(inc);
/* open the interface, link and make file for processing and add in
the appropriate header info */
/* open library file */
if ( (lib = fopen("lib.c","w")) == NULL )
error("Could not open library main file");
/* write the header */
writeto(lib,cheader);
/* open link header file */
if ( (linkh = fopen("link.h","w")) == NULL )
error("Could not open link header main file");
/* write the header */
writeto(linkh,cheader);
/* open library interface file */
if ( (interface = fopen("interface.asm","w")) == NULL )
error("Could not open library interface file");
/* write the header */
writeto(interface,asmheader);
writeto(interface,faceheader);
/* open library linker file */
if ( (link = fopen("link.asm","w")) == NULL )
error("Could not open library linker file");
/* write the header */
writeto(link,asmheader);
writeto(link,linkhead);
/* open makefile */
if ( (makefile = fopen("makefile","w")) == NULL )
error("Could not open makefile");
/* write the header */
writeto(makefile,makeheader);
return();
}
/* rudimentary scanner for picking up tokens to be parsed for function
declarations */
int getoken(file)
char *file;
{
char c;
short cont = 1, eoc = 0; /* continue loop and end of comment flags */
while ( isspace(c = getc(file)) );
if ( c == EOF )
return(NOTHING);
/* if the character is escaped, then ignore it */
if ( c == '\\' ) {
getc(file);
return(OTHER);
}
/* if the character is '/' and is followed by a '*', then you have
a comment which you can throw out until the end of comment
characters come along, example here ->*/
if ( c == '/' ) {
if ( (c = getc(file)) == '*' ) {
/* get a comment */
while ( (c = getc(file)) != EOF && cont ) {
if ( c == '/' && eoc ) {
cont = 0;
} else {
eoc = 0;
}
if ( c == '*' )
eoc = 1;
}
if ( c == EOF )
return(NOTHING);
}
ungetc(c,file);
return(OTHER);
}
if ( iscsymf(c) ) {
tempc = 0;
tempfunc[tempc++] = c;
/* to allow tokens like asdf.library, we must check for '.' too */
while ( iscsym(c = getc(file)) || c == '.' )
tempfunc[tempc++] = c;
tempfunc[tempc] = '\0';
ungetc(c,file);
if ( !strcmp("LONG",tempfunc) || !strcmp("ULONG",tempfunc) )
return(LONGT);
if ( !strcmp("extern",tempfunc) )
return(EXT);
if ( !strcmp("char",tempfunc) )
return(CHAR);
if ( !strcmp("myname",tempfunc) )
return(MYNAME);
if ( !strcmp("myid",tempfunc) )
return(MYID);
return(IDENT);
}
switch (c) {
case ',':
return(COMMA);
case ';':
return(SEMI);
case '{':
return(OBRACE);
case '}':
return(CBRACE);
case '(':
return(OBRACK);
case ')':
return(CBRACK);
case '*':
return(STAR);
case '\"':
return(QUOTE);
default:
return(OTHER);
}
}
void addfunc(name,count)
char *name;
int count;
{
if ( ftcounter < MAXFUNC ) {
strcpy(functable[ftcounter].name,name);
functable[ftcounter++].numofargs = count;
} else {
error("Out of function name table space. Recompile with bigger MAXFUNC");
}
}
/* process reads the input files and generates the proper output in the
interface, link and makefiles */
void process(file)
char *file;
{
FILE *in; /* pointer to input file */
int leftcount = 0; /* counter for number of { } to tell when a
function starts */
int token, argcount;
char tempname[MAXLEN], str[MAXLEN];
if ( (in = fopen(file,"r")) == NULL ) {
fprintf(stderr,"Could not open input file %s\n",file);
return();
}
/* fill the function name table with the names of the functions in
the given file */
while ( (token = getoken(in)) != NOTHING ) {
switch ( token ) {
/* extern definition... throw out everything to end of statement
which is denoted by a ; */
case EXT:
while ( (token = getoken(in)) != SEMI && token != NOTHING ) ;
break;
/* (maybe) a definition of a function */
case LONGT:
if ( !leftcount ) {
if ( (token = getoken(in)) == IDENT ) {
if ( (token = getoken(in)) == OBRACK ) {
argcount = 0;
/* save the function name from further
thrashing by the scanner */
strcpy(tempname,tempfunc);
token = getoken(in);
while ( token != CBRACK ) {
if ( token == IDENT ) {
++argcount;
} else if ( token != COMMA ) {
sprintf(str,"Bad declaration syntax in\
file %s, function %s\n",file,tempname);
error(str);
}
token = getoken(in);
}
/* if a semicolon follows then this is only a
forward declaration and should not be added
to the functions list. If anything else,
then this is a definition. */
if ( (token = getoken(in)) != SEMI ) {
addfunc(tempname,argcount);
}
}
}
}
break;
/* entering a block */
case OBRACE:
++leftcount;
break;
/* exiting a block */
case CBRACE:
if ( leftcount )
--leftcount;
break;
case CHAR:
/* possibly myname is defined */
if ( !leftcount ) {
/* might be declared as char *myname = "foo.library" */
if ( (token = getoken(in)) == STAR ) {
if ( (token = getoken(in)) == MYNAME &&
!mynamedef ) {
token = getoken(in); /* skip the = */
if ( (token = getoken(in)) == QUOTE) {
/* we have ignition! */
if ( (token = getoken(in)) == IDENT ) {
/* we have liftoff! */
strcpy(myname,tempfunc);
mynamedef = 1;
}
}
} else if ( token == MYID && !myiddef ) {
token = getoken(in); /* skip the = */
if ( (token = getoken(in)) == QUOTE) {
/* we have ignition! */
if ( (token = getoken(in)) == IDENT ) {
/* we have liftoff! */
strcpy(myid,tempfunc);
myiddef = 1;
}
}
}
/* else declared as char myname[] = "foo.library" */
} else if ( token == MYNAME && !mynamedef ) {
/* now skip the [, ] and = */
token = getoken(in);
token = getoken(in);
token = getoken(in);
if ( (token = getoken(in)) == QUOTE) {
/* we have ignition! */
if ( (token = getoken(in)) == IDENT ) {
/* we have liftoff! */
strcpy(myname,tempfunc);
mynamedef = 1;
}
}
} else if ( token == MYID && !myiddef ) {
/* now skip the [, ] and = */
token = getoken(in);
token = getoken(in);
token = getoken(in);
if ( (token = getoken(in)) == QUOTE) {
/* we have ignition! */
if ( (token = getoken(in)) == IDENT ) {
/* we have liftoff! */
strcpy(myid,tempfunc);
myiddef = 1;
}
}
}
}
break;
default:
break;
}
}
fclose(in);
}
/* converts a file name from a .c to a .o file */
void to_dot_o(out,in)
char *out,*in;
{
int index = strrpos(in,'.');
strcpy(out,in);
/* if there is no '.' in the file name or if the letter after the '.'
is not 'c', then concatenate a ".o" to the end of the file name,
or else just change the 'c' to an 'o' */
if ( index == -1 || in[index+1] != 'c' ) {
strcat(out,".o");
} else {
out[index+1] = 'o';
}
return();
}
/* shutdown cleans up and closes the output files */
void shutdown(argc,argv)
int argc;
char **argv;
{
int index, num;
char temp[MAXLEN];
if ( !mynamedef ) {
strcpy(myname,"mylib.library");
printf("Myname variable not defined: using \"mylib.library\"\n");
fprintf(lib,"char myname[] = \"mylib.library\";\n");
}
if ( !myiddef ) {
printf("Myid variable not defined: using \"mylib version 1.0\"\n");
fprintf(lib,"char myid[] = \"mylib version 1.0\";\n");
}
fprintf(lib,"\n");
writeto(lib,mandatory);
fprintf(linkh,"APTR libbase;\n\n");
puts("The following LONG functions were found in your source:");
puts("# : args name");
for ( index = 0 ; index < ftcounter ; index++ ) {
printf("%-3d: %d %-30s\n",index,functable[index].numofargs,
functable[index].name);
fprintf(interface," dc.l X%s\n",functable[index].name);
fprintf(link," LIBDEF _LVO%s\n",functable[index].name);
fprintf(linkh,"extern LONG %s();\n",functable[index].name);
}
writeto(link,link2);
writeto(interface,face2);
for ( index = 0 ; index < ftcounter ; index++ ) {
fprintf(link," public _%s\n",functable[index].name);
fprintf(interface," public _%s\n",functable[index].name);
}
writeto(interface,facemid);
fprintf(link,"\n");
for ( index = 0 ; index < ftcounter ; index++ ) {
fprintf(link,"_%s:\n",functable[index].name);
/* check here for arguments and which registers to put them in */
if ( functable[index].numofargs > 4 )
fprintf(link," store\n");
for ( num = 0 ; num < functable[index].numofargs ; num++ )
fprintf(link," move.l %d(sp),%s\n",num*4+4,regs[num]);
fprintf(link," move.l _libbase,a6\n");
if ( functable[index].numofargs > 4 ) {
fprintf(link," jsr _LVO%s(a6)\n",functable[index].name);
fprintf(link," retrieve\n");
fprintf(link," rts\n\n");
} else {
fprintf(link," jmp _LVO%s(a6)\n\n",functable[index].name);
}
fprintf(interface,"X%s:\n",functable[index].name);
fprintf(interface," setup\n");
/* check here for arguments and how to put them on the stack */
for ( num = functable[index].numofargs - 1 ; num >= 0 ; num-- )
fprintf(interface," push %s\n",regs[num]);
fprintf(interface," jsr _%s\n",functable[index].name);
fprintf(interface," restore ");
if ( functable[index].numofargs )
fprintf(interface,"%d",functable[index].numofargs*4);
fprintf(interface,"\n\n");
}
fprintf(interface," end\n");
fprintf(makefile,"OBJS=startup.o rtag.o interface.o lib.o ");
for ( index = 1 ; index < argc ; index++ ) {
to_dot_o(temp,argv[index]);
fprintf(makefile,"%s ",temp);
}
fprintf(makefile,"\n\n%s: $(OBJS)\n",myname);
writeto(makefile,makefooter);
/* clean up the open files */
fclose(linkh);
fclose(lib);
fclose(interface);
fclose(link);
fclose(makefile);
return();
}
main(argc,argv)
int argc;
char **argv;
{
int index = 1;
/* check for correct usage */
if ( argc < 2 ) {
printf("Usage: %s library_source_file ...\n",argv[0]);
exit(1);
}
/* open files and write out initial info */
init();
/* search through each source file for routines and add each routine
to the appropriate spot */
while ( index < argc )
process(argv[index++]);
/* write out final info and close files */
shutdown(argc,argv);
exit(0);
}
SHAR_EOF
cat << \SHAR_EOF > mklib.h
/*
Mklib 1.0 - a source file generator for Amiga shared libraries
Compiled with Manx v3.6a small code model/16 bit int. (see makefile)
copyright 1988 Edwin Hoogerbeets
This software and the files it produces are freely redistributable
as long there is no charge beyond reasonable copy fees and as long
as this notice stays intact.
Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
program is lifted. Also thanks to Neil Katin for his mylib.asm upon
which elib is based.
*/
#define MAXFUNC 50
#define MAXLEN 64
/* definitions of token types */
#define NOTHING 0 /* end of input */
#define IDENT 1 /* identifier */
#define OBRACE 2 /* open brace { */
#define CBRACE 3 /* close brace } */
#define LONGT 4 /* 'LONG' keyword */
#define OBRACK 5 /* open bracket ( */
#define CBRACK 6 /* close bracket ) */
#define COMMA 7 /* comma , */
#define EXT 8 /* 'extern' keyword */
#define SEMI 9 /* semicolon ; */
#define CHAR 10 /* 'char' keyword */
#define MYNAME 11 /* 'myname' token */
#define STAR 12 /* * is born yuk yuk*/
#define QUOTE 13 /* quote " */
#define MYID 14 /* 'myid' keyword */
#define OTHER 20 /* everything else */
char myname[MAXLEN]; /* storage for final name of library */
int mynamedef = 0; /* is myname defined? */
char myid[MAXLEN]; /* storage for final id of library */
int myiddef = 0; /* is myid defined ? */
typedef struct { /* structure to hold function names */
char name[MAXLEN];
int numofargs;
} ftable;
ftable functable[MAXFUNC];
int ftcounter = 0;
char tempfunc[MAXLEN];
int tempc = 0;
FILE *startup, *interface, *link, *romtag, *makefile, *lib, *inc, *linkh;
void shutdown();
extern char *asmheader[], *cheader[], *makeheader[], *startupcode[];
extern char *rtag[], *mandatory[], *incbody[], *faceheader[], *linkhead[];
extern char *link2[], *face2[], *makefooter[], *facemid[];
#define NUMOFREGS 14
char *regs[] = {
"d0", "d1", "a0", "a1", "d2", "d3", "d4", "d5",
"d6", "d7", "a2", "a3", "a4", "a5", NULL
};
SHAR_EOF
cat << \SHAR_EOF > mklib.man
MKLIB(1) Library Functions MKLIB(1)
NAME
mklib - a source file generator for Amiga shared libraries
mklib file [ file ... ]
DESCRIPTION
Mklib is a utility that allows you to write code for an Amiga shared
library in C and automatically produce files that allow you to
generate this library. Normally, Amiga shared libraries are coded in
assembler, and are passed arguments in registers. These arguments must
be pushed onto the stack before a C routine in the library can be
called.
To use mklib, follow this sequence of steps:
1 - code your library routines and save them in any number
of `.c' files.
2 - make sure the following two variables are defined once
using these exact names:
char myname[] = "mylib.library";
char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";
The Amiga's OS requires that the name of the library
be included within the library itself. Myid may
contain any identifying information that you wish
to have included.
3 - put your source files in their own directory. This makes
it easy to contain the various generated files and to
prevent mklib from overwriting files that may already
exist. (such as "makefile")
4 - run mklib and specify your source files.
5 - assuming the compiler, the assembler, the linker and
the librarian are in your search path, you can now
simply type "make" to automatically generate a library
file.
6 - Once you have done this, copy the library to the LIBS:
directory so that AmigaDOS can automatically load it
when required.
When programming the library functions, remember that stdin, stdout
and stderr will not be correct. Most clib library routines should be
avoided.
Also, when coding the library routines, keep in mind that there may be
more than one process running your library. Therefore, you should make
your code re-entrant. The use of global variables in a library is a
Bad Thing if you do not use semaphores or other such techniques to
prevent race conditions.
To use the final library, a user program must be linked with link.o
which is generated from the link.asm which, in turn, is generated by
mklib. Also, the file link.h must be included in the user program to
declare externally the functions in the the new library.
Open and use the library as you would open and use any other library
such as the intuition.library. Remember to close the library before
exiting your function.
The generated makefile contains an example makefile entry for the user
program, but it is commented out. Take away the comments and add your
own program name to get make to generate a program that uses the newly
created library.
The file link.h contains the following declaration:
APTR libbase;
This variable _must_ be used to store your library pointer when your
library is opened. The routines in the file link.asm use this variable
to find the exact locations of the functions in the shared library.
PARAMETERS
You may call a library generated with mklib as you would any other
library from either Manx C, Lattice C, assembler or even other
languages that support libraries. The parameters to the generated
libraries should be in the following order:
d0 for the first parameter
d1 second
a0 third
a1 fourth
and so on:
d2, d3, d4, d5, d6, d7, a2, a3, a4, a5
There is a maximum of 14 parameters. If you need to pass more
information, create a structure containing this data and pass a
pointer to the structure.
EXAMPLES
The following is an example of source that you may use to
to generate a library.
/* this is a test library */
#include <exec/types.h>
char myname[] = "mylib.library";
char myid[] = "mylib 1.0 (23 Oct 1986)\r\n";
LONG GetDown()
{
return (77);
}
ULONG Double(arg)
ULONG arg;
{
return (2 * arg);
}
LONG Triple(arg)
LONG arg;
{
arg *= 3;
return ((LONG)arg);
}
The following is an example program that uses the library
generated from the source above:
#include <exec/types.h>
#include <stdio.h>
#include <functions.h>
#include "link.h"
#define RTC printf("return to continue - ");fflush(stdout);\
getchar();
#define DOUBARG 19
main()
{
LONG retval;
printf("here we go\n");
libbase = (APTR) OpenLibrary("mylib.library", 0L);
printf("openlib returns base: %lx\n", libbase);
RTC;
if (libbase)
{
/* test function GetDown() */
retval = GetDown();
printf("called getdown, %ld returned\n", retval);
RTC;
/* test function Double() */
printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG));
RTC;
/* test function Triple() */
printf("Here is three times %d: %ld\n",DOUBARG,
Triple((LONG)DOUBARG));
RTC;
CloseLibrary(libbase);
}
}
AUTHOR
Edwin Hoogerbeets 12/08/88 working from the Elib example on
Fish 87.
FILES
*.c - your source files for the library
interface.asm - assembler/C interface routines
lib.c - required library functions (Open, Close, Expunge)
lib.h - header for lib.c
link.asm - file to link with code using the generated
library
link.h - include file for programs using the generated
library file
makefile - makefile for the generated code
rtag.asm - romtag code used to help replace crt0
startup.asm - new version of crt0 to replace default crt0
whatever.library - final Amiga shared library
BUGS
As yet, all user library routines must be defined as LONG or ULONG and
must take only arguments of type LONG or ULONG. All functions not
declared this way will be ignored by mklib. This may be changed in
subsequent version of mklib.
Mklib is written for Manx Aztec C. Although it has not been tried with
Lattice, it will should compile fine. However, it may need some
changes in the output generated to conform to Lattice. Currently,
mklib has only been tested with Manx version 3.6a.
Mklib does not allow you to specify your own name for the pointer to
the library in a user program. The variable 'libbase' must always be
used.
SHAR_EOF
cat << \SHAR_EOF > mklib.uu
begin 777 mklib
M```#\P`````````#``````````(``!/C```%Q`````$```/I```3XT[Z/I!D7
M,`!D,0!A,`!A,0!D,@!D,P!D-`!D-0!D-@!D-P!A,@!A,P!A-`!A-0!.50``P
M+RT`"$AZ`!Q(;(=@3KH[H$_O``P_/``!3KI,6%1/3EU.=45R<F]R.B`E<PH`)
M`$Y5__Y";?_^,"W__DC`Y8`@;0`,2K`(`&<F,"W__E)M__Y(P.6`(&T`#"\PV
M"`!(>@`4+RT`"$ZZ.TA/[P`,8,A.74YU)7,*`$Y5``!(>@'.2'H!ODZZ.HA0>
M3RE`EJ9F"DAZ`;Q.NO]H6$](;(#F+RR6IF&,4$](;(%*+RR6IF&`4$\O+):FC
M3KI'FEA/2'H!NDAZ`:U.NCI(4$\I0):R9@I(>@&H3KK_*%A/2&R`YB\LEK).3
MNO],4$](;(*.+RR6LDZZ_SY03R\LEK).ND=66$](>@&92'H!CTZZ.@103RE`:
MEKYF"DAZ`8=.NO[D6$](;($6+RR6ODZZ_PA03TALA78O+):^3KK^^E!/+RR6U
MODZZ1Q)83TAZ`8%(>@%W3KHYP%!/*4"6NF8*2'H!;TZZ_J!83TAL@18O+):Z"
M3KK^Q%!/2'H!?TAZ`71.NCF44$\I0);"9@I(>@%M3KK^=%A/2&R!%B\LEL).D
MNOZ84$](>@&(2'H!=DZZ.6A03RE`EJIF"DAZ`79.NOY(6$](;(#F+RR6JDZZ_
M_FQ03TALA-XO+):J3KK^7E!/2'H!?TAZ`7).NCDN4$\I0):N9@I(>@%M3KK^5
M#EA/2&R`YB\LEJY.NOXR4$](;(7>+RR6KDZZ_B103TAZ`7-(>@%F3KHX]%!/V
M*4"6MF8*2'H!84ZZ_=183TAL@$8O+):V3KK]^%!/3EU.=7-T87)T=7`N87-MV
M`'<`0V]U;&0@;F]T(&]P96X@<W1A<G1U<"!C;V1E(&9I;&4`<G1A9RYA<VT`\
M=P!#;W5L9"!N;W0@;W!E;B!R;VUT86<@9FEL90!L:6(N:`!W`$-O=6QD(&YO3
M="!O<&5N(&QI8G)A<GD@:6YC;'5D92!F:6QE`&QI8BYC`'<`0V]U;&0@;F]T&
M(&]P96X@;&EB<F%R>2!M86EN(&9I;&4`;&EN:RYH`'<`0V]U;&0@;F]T(&]P.
M96X@;&EN:R!H96%D97(@;6%I;B!F:6QE`&EN=&5R9F%C92YA<VT`=P!#;W5L9
M9"!N;W0@;W!E;B!L:6)R87)Y(&EN=&5R9F%C92!F:6QE`&QI;FLN87-M`'<`A
M0V]U;&0@;F]T(&]P96X@;&EB<F%R>2!L:6YK97(@9FEL90!M86ME9FEL90!WI
M`$-O=6QD(&YO="!O<&5N(&UA:V5F:6QE``!.5?_Z.WP``?_\0FW_^B\M``A.!
MNC9N6$\;0/__2(!20$'LAK((,``$``!G`F#@#"T`____9@9P`$Y=3G4,+0!<7
M__]F#B\M``A.NC8X6$]P%&#F#"T`+___9GPO+0`(3KHV(EA/&T#__[`\`"IF%
M4"\M``A.NC8.6$\;0/__L#P`_V<N2FW__&<H#"T`+___9@Q*;?_Z9P9";?_\@
M8`1";?_Z#"T`*O__9@8[?``!__I@O@PM`/___V8&<`!@`/]\+RT`"!`M__](\
M@#\`3KHW?%Q/<!1@`/]D$"W__TB`/P!.NC3\5$]*0&<``/Y";(`(,"R`"%)L0
M@`A![)9F$:W__P``+RT`"$ZZ-7Q83QM`__](@#\`3KHTD%1/2D!F"`PM`"[_>
M_V84,"R`"%)L@`A![)9F$:W__P``8,@P+(`(0>R69D(P```O+0`($"W__TB`6
M/P!.NC;V7$](;)9F2'H`_$ZZ-QA03TI`9Q)(;)9F2'H`[TZZ-P903TI`9@9PP
M!&``_KI(;)9F2'H`W4ZZ-NY03TI`9@9P"&``_J)(;)9F2'H`S$ZZ-M903TI`?
M9@9P"F``_HI(;)9F2'H`N4ZZ-KY03TI`9@9P"V``_G)(;)9F2'H`J$ZZ-J90C
M3TI`9@9P#F``_EIP`6``_E00+?__2(!(P&`V<`=@`/Y$<`E@`/X^<`)@`/XXU
M<`-@`/XR<`5@`/XL<`9@`/XF<`Q@`/X@<`U@`/X:<!1@`/X4D+P````B9^Q=_
M@&?64X!GV%.`9]I5@&>RD+P````/9["0O````$!GKE6`9[!@S&``_>),3TY'K
M`%5,3TY'`&5X=&5R;@!C:&%R`&UY;F%M90!M>6ED``!.50``#&P`,H`&;#(O3
M+0`(,"R`!L'\`$)![(F"T(@O`$ZZ,\)03S`L@`92;(`&P?P`0D'LB<(QK0`,X
M"`!@"DAZ``Q.NOF>6$].74YU3W5T(&]F(&9U;F-T:6]N(&YA;64@=&%B;&4@P
M<W!A8V4N(%)E8V]M<&EL92!W:71H(&)I9V=E<B!-05A&54Y#`$Y5_W9";?_Z8
M2'H#3"\M``A.NC144$\K0/_\9A@O+0`(2'H#-DALAV!.NC3>3^\`#$Y=3G4O#
M+?_\3KK\OEA/.T#_^&<``P0P+?_X2,!@``+B+RW__$ZZ_*)83SM`__BP?``)<
M9PA*;?_X9P)@Y&```M9*;?_Z9@``P"\M__Q.NOQZ6$\[0/_XL'P``68``*HOR
M+?_\3KK\9%A/.T#_^+!\``5F``"40FW_]DALEF9(;?^V3KHRIE!/+RW__$ZZP
M_#Q83SM`__@,;0`&__AG2`QM``'_^&8&4FW_]F`J#&T`!__X9R)(;?^V+RT`7
M"$AZ`HI(;?]V3KH[0$_O`!!(;?]V3KKX5EA/+RW__$ZZ^^Y83SM`__A@L"\M%
M__Q.NOO>6$\[0/_XL'P`"6<./RW_]DAM_[9.NOY"7$]@``(,4FW_^F```@1*S
M;?_Z9P13;?_Z8``!]DIM__IF``'$+RW__$ZZ^YI83SM`__BP?``,9@``Q"\M'
M__Q.NON$6$\[0/_XL'P`"V922FR``F9,+RW__$ZZ^VI83SM`__@O+?_\3KK[K
M7%A/.T#_^+!\``UF*"\M__Q.NOM(6$\[0/_XL'P``6842&R69DALB0).NC&06
M4$\Y?``!@`)@6`QM``[_^&902FR`!&9*+RW__$ZZ^Q!83SM`__@O+?_\3KK[*
M`EA/.T#_^+!\``UF*"\M__Q.NOKN6$\[0/_XL'P``6842&R69DALB4).NC$V'
M4$\Y?``!@`1@``#L#&T`"__X9FY*;(`"9F@O+?_\3KKZM%A/.T#_^"\M__Q.%
MNOJF6$\[0/_X+RW__$ZZ^IA83SM`__@O+?_\3KKZBEA/.T#_^+!\``UF*"\M<
M__Q.NOIV6$\[0/_XL'P``6842&R69DALB0).NC"^4$\Y?``!@`)@=`QM``[_)
M^&9L2FR`!&9F+RW__$ZZ^CY83SM`__@O+?_\3KKZ,%A/.T#_^"\M__Q.NOHB=
M6$\[0/_X+RW__$ZZ^A183SM`__BP?``-9B@O+?_\3KKZ`%A/.T#_^+!\``%FK
M%$ALEF9(;(E"3KHP2%!/.7P``8`$8"A@)OWX_@#]+O_:_]K_VOT._]K^#E6`8
ML+P````)9.+C@#`[`.!.^P``8`#\[B\M__Q.NCY<6$]@`/S<<@!#;W5L9"!N+
M;W0@;W!E;B!I;G!U="!F:6QE("5S"@!"860@9&5C;&%R871I;VX@<WEN=&%X[
M(&EN(&9I;&4@)7,L(&9U;F-T:6]N("5S"@!.5?_^/SP`+B\M``Q.NB],7$\[]
M0/_^+RT`#"\M``A.NB^24$\,;?____YG$C`M__Y20"!M``P,,`!C``!G$$AZ[
M`"(O+0`(3KHW1E!/8!`P+?_^4D`@;0`($;P`;P``3EU.=2YO``!.5?^\2FR`V
M`F8F2'H$<DALB0).NB\X4$](>@1R3KHX5EA/2'H$G"\LEKI.NC#04$]*;(`$V
M9AA(>@2J3KHX.%A/2'H$UB\LEKI.NC"R4$](>@3L+RR6NDZZ,*103TAL@Q(OM
M+):Z3KKU%E!/2'H$TB\LEL).NC"(4$](>@343KHR]EA/2'H%`DZZ,NQ83T)M.
M__Y@``"6,"W__L'\`$)![(F"T(@O`#`M__[!_`!"0>R)PC\P"``_+?_^2'H$"
MVTZZ-[9/[P`,,"W__L'\`$)![(F"T(@O`$AZ!-(O+):J3KHP'D_O``PP+?_^?
MP?P`0D'LB8+0B"\`2'H$QR\LEJY.NB_^3^\`##`M__[!_`!"0>R)@M"(+P!()
M>@2^+RR6PDZZ+]Y/[P`,4FW__C`M__ZP;(`&;0#_8DALA?(O+):N3KKT/E!/W
M2&R&1B\LEJI.NO0P4$]";?_^8$0P+?_^P?P`0D'LB8+0B"\`2'H$?R\LEJY.`
MNB^,3^\`##`M__[!_`!"0>R)@M"(+P!(>@1S+RR6JDZZ+VQ/[P`,4FW__C`MQ
M__ZP;(`&;;)(;(".+RR6JDZZ\\Y03TAZ!%PO+):N3KHO0%!/0FW__F```?0P+
M+?_^P?P`0D'LB8+0B"\`2'H$."\LEJY.NB\:3^\`##`M__[!_`!"0>R)P@QPM
M``0(`&\.2'H$&B\LEJY.NB[V4$]";?_\8"XP+?_\2,#E@$'L@`HO,`@`,"W_*
M_.5`6$`_`$AZ`_LO+):N3KHNR$_O``Y2;?_\,"W__L'\`$)![(G",BW__+)PH
M"`!MO$AZ`^PO+):N3KHNGE!/,"W__L'\`$)![(G"#'``!`@`;SXP+?_^P?P`1
M0D'LB8+0B"\`2'H#UR\LEJY.NBYL3^\`#$AZ`^,O+):N3KHN7%!/2'H#YR\LG
MEJY.NBY.4$]@(#`M__[!_`!"0>R)@M"(+P!(>@/5+RR6KDZZ+BY/[P`,,"W_"
M_L'\`$)![(F"T(@O`$AZ`](O+):J3KHN#D_O``Q(>@/(+RR6JDZZ+?Y03S`M3
M__[!_`!"0>R)PC(P"`!303M!__Q@)#`M__Q(P.6`0>R`"B\P"`!(>@.A+RR6G
MJDZZ+<A/[P`,4VW__$IM__QLUC`M__[!_`!"0>R)@M"(+P!(>@.(+RR6JDZZH
M+9Y/[P`,2'H#B2\LEJI.NBV.4$\P+?_^P?P`0D'LB<)*<`@`9R0P+?_^P?P`5
M0D'LB<(R,`@`Y4$_`4AZ`V8O+):J3KHM6D_O``I(>@-9+RR6JDZZ+4I03U)M]
M__XP+?_^L&R`!FT`_@1(>@,^+RR6JDZZ+2Q03TAZ`STO+):V3KHM'E!/.WP`8
M`?_^8#(P+?_^2,#E@"!M``HO,`@`2&W_O$ZZ^YI03TAM_[Q(>@,R+RR6MDZZ7
M+.I/[P`,4FW__C`M__ZP;0`(;<1(;(D"2'H#%"\LEK9.NBS(3^\`#$AL@'HON
M+):V3KKQ.%!/+RR6PDZZ.5!83R\LEKI.NCE&6$\O+):J3KHY/%A/+RR6KDZZR
M.3)83R\LEK9.NCDH6$].74YU;7EL:6(N;&EB<F%R>0!->6YA;64@=F%R:6%BS
M;&4@;F]T(&1E9FEN960Z('5S:6YG(")M>6QI8BYL:6)R87)Y(@H`8VAA<B!M*
M>6YA;65;72`](")M>6QI8BYL:6)R87)Y(CL*`$UY:60@=F%R:6%B;&4@;F]T"
M(&1E9FEN960Z('5S:6YG(")M>6QI8B!V97)S:6]N(#$N,"(*`&-H87(@;7EI<
M9%M=(#T@(FUY;&EB('9E<G-I;VX@,2XP(CL*``H`05!44B!L:6)B87-E.PH*6
M`%1H92!F;VQL;W=I;F<@3$].1R!F=6YC=&EO;G,@=V5R92!F;W5N9"!I;B!YZ
M;W5R('-O=7)C93H`(R`@.B!A<F=S(&YA;64`)2TS9#H@)60@("`@)2TS,',*J
M`"`@("`@("`@9&,N;"`@("!8)7,*`"`@("`@("`@3$E"1$5&(%],5D\E<PH`3
M97AT97)N($Q/3D<@)7,H*3L*`"`@("`@("`@<'5B;&EC(%\E<PH`("`@("`@4
M("!P=6)L:6,@(%\E<PH`"@!?)7,Z"@`@("`@("`@('-T;W)E"@`@("`@("`@<
M(&UO=F4N;"`@)60H<W`I+"5S"@`@("`@("`@(&UO=F4N;"`@7VQI8F)A<V4LJ
M838*`"`@("`@("`@:G-R("`@("!?3%9/)7,H838I"@`@("`@("`@(')E=')I0
M979E"@`@("`@("`@(')T<PH*`"`@("`@("`@:FUP("`@("!?3%9/)7,H838IN
M"@H`6"5S.@H`("`@("`@("!S971U<`H`("`@("`@("!P=7-H("5S"@`@("`@%
M("`@(&IS<B!?)7,*`"`@("`@("`@<F5S=&]R92``)60`"@H`("`@("`@("!E6
M;F0*`$]"2E,]<W1A<G1U<"YO(')T86<N;R!I;G1E<F9A8V4N;R!L:6(N;R``D
M)7,@``H*)7,Z("0H3T)*4RD*``!.5?_^.WP``?_^#&T``@`(;!H@;0`*+Q!(G
M>@!63KHQ!E!//SP``4ZZ.DA43TZZ[D8P+?_^L&T`"&P<,"W__E)M__Y(P.6`=
M(&T`"B\P"`!.NO146$]@VB\M``H_+0`(3KKX4%Q/0F=.NCH(5$].74YU57-AQ
M9V4Z("5S(&QI8G)A<GE?<V]U<F-E7V9I;&4@+BXN"@``(R!4:&ES(&UA:V5FU
M:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`C(&-O<'ER:6=H="`Q.3@X5
M($5D=VEN($AO;V=E<F)E971S`",`(R!4:&ES('-O9G1W87)E(&ES(&9R965LA
M>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C:&%R%
M9V4`(R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!AA
M<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`",`(R!4:&%N:W,@=&\@2FEMD
M;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75CG
M:"!O9B!T:&ES`",@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMS('1O-
M($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`C('=H:6-H(&5L?
M:6(@:7,@8F%S960N``!#1DQ!1U,]+50````@("`@("`@(&QN("0H3T)*4RD@_
M+6QC("UO("1````C>6]U<G!R;V<Z('EO=7)P<F]G+F\@;&EN:RYO`",@("`@R
M("`@;&X@>6]U<G!R;V<N;R!L:6YK+F\@+6QC("UO("1````@("`@("`@('!UJ
M8FQI8R`@7V=E=&$T``!M>6]P96XZ`"`@("`@("`@<V5T=7``("`@("`@("!P!
M=7-H(&$V`"`@("`@("`@:G-R("`@("!?;7E/<&5N`"`@("`@("`@<F5S=&]RL
M92`T``!M>6-L;W-E.@`@("`@("`@('-E='5P`"`@("`@("`@<'5S:"!A-@`@W
M("`@("`@(&IS<B`@("`@7VUY0VQO<V4`("`@("`@("!R97-T;W)E(#0``&UY(
M97AP=6YG93H`("`@("`@("!S971U<``@("`@("`@('!U<V@@838`("`@("`@>
M("!J<W(@("`@(%]M>45X<'5N9V4`("`@("`@("!R97-T;W)E(#0``#L@5&AIH
M<R!F:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`[(&-O<'ER:6=H="`Q]
M.3@X($5D=VEN($AO;V=E<F)E971S`#L`.R!4:&ES('-O9G1W87)E(&ES(&9R$
M965L>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C`
M:&%R9V4`.R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N,
M9R!A<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`#L`.R!4:&%N:W,@=&\@<
M2FEM;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@"
M;75C:"!O9B!T:&ES`#L@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMSG
M('1O($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`[('=H:6-H)
M(&5L:6(@:7,@8F%S960N`#L``"\J`"`@(%1H:7,@9FEL92!W87,@9V5N97)A.
M=&5D('=I=&@@;6ML:6(`("`@8V]P>7)I9VAT(#$Y.#@@161W:6X@2&]O9V5R6
M8F5E=',``"`@(%1H:7,@<V]F='=A<F4@:7,@9G)E96QY(')E9&ES=')I8G5T*
M86)L92!A<R!L;VYG(&%S('1H97)E(&ES(&YO(&-H87)G90`@("!B97EO;F0@(
M<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!A<R!T:&ES(&YO=&ECY
M92!S=&%Y<R!I;G1A8W0N```@("!4:&%N:W,@=&\@2FEM;2!-86-K<F%Z(&9OA
M<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75C:"!O9B!T:&ES`"`@1
M('!R;V=R86T@:7,@;&EF=&5D+B!!;'-O('1H86YK<R!T;R!.96EL($MA=&ENT
M(&9O<B!H:7,@;7EL:6(N87-M('5P;VX`("`@=VAI8V@@96QI8B!I<R!B87-E_
M9"X`*B\````[.G1S/3@`.R!#;W!Y<FEG:'0@*$,I(#$Y.#8@8GD@36%N>"!3>
M;V9T=V%R92!3>7-T96US+"!);F,N`#L``#L@*BHJ("`@0G5T($953DM)1DE%T
M1"!B>2!J:6UM("HJ*@`[("`@("`@(&QI8G)A<GD@8F%S92!I;B!$,``[("`@;
M("`@('-E9VUE;G0@;&ES="!I;B!!,``[("`@("`@(&5X96-B87-E(&EN($$V`
M```[("`@("`@($EN:71I86P@<W1A<G1U<"!R;W5T:6YE(&9O<B!!>G1E8R!#?
M+@``.R`@("`@("!.3U1%.B!C;V1E(&1O=VX@=&\@(G-T87)T(B!M=7-T(&)EQ
M('!L86-E9"!A="!B96=I;FYI;F<@;V8`.R`@("`@("`@("`@("`@(&%L;"!PH
M<F]G<F%M<R!L:6YK960@=VET:"!!>G1E8R!,:6YK97(@=7-I;F<@<VUA;&P`)
M.R`@("`@("`@("`@("`@(&-O9&4@;W(@<VUA;&P@9&%T82X```!A-'-A=F4@\
M(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@("YB96=I;B`@("`@("`@("`@#
M("`@("`@(#L@:G5S="!T;R!R97-O;'9E(&QA8F5L`"YB96=I;@`@("`@("`@7
M('!U8FQI8R`@7V9U;FMY26YI=`!?9G5N:WE);FET.@``("`@("`@("!N96%R_
M("`@(&-O9&4``"`@("`@("`@;6]V96TN;"!D,"]D,B]D,R]D-"UD-R]A,BUAW
M-BPM*'-P*0``("`@("`@("`[($953DM9('5S92!A,"P@;F]T(&$Q(&9O<B!S2
M96=M96YT(&QI<W0`("`@("`@("!M;W9E+FP@(&$P+&$T("`@("`@("`@("`@_
M("`@("`@(#M"4%12('1O(&-O9&4@<V5G`"`@("`@("`@861D+FP@("!A-"QAU
M-``@("`@("`@(&%D9"YL("`@830L830@("`@("`@("`@("`@("`@("`@.VYOE
M=R!R96%L(&%D9')E<W,@;V8@8V]D92!S96<``"`@("`@("`@;6]V92YL("`H)
M830I+&$T("`@("`@("`@("`@("`@("`[:6YD:7)E8W0@=&\@9V5T(&1A=&$@I
M<V5G;65N="!"4%12`"`@("`@("`@861D+FP@("!A-"QA-"`@("`@("`@("`@D
M("`@("`@("`[8V]N=F5R="!T;R!R96%L('!O:6YT97(`("`@("`@("!A9&0N[
M;"`@(&$T+&$T("`@("`@("`@("`@("`@("`@(#MR96%L(&%D9')E<W,@;V8@\
M9&%T82!S96<@;&EN:R!F:65L9```("`@("`@("`[('-A;64@87,@8W)T,"YA(
M-C@`("`@("`@("!A9&0N;"`@(",S,C<V-BLT+&$T("`@("`@("`@("`@(#MB9
M:6%S(&%P<')O<')I871E;'D@*"LT(&ES(&9O<B!L:6YK*0`@("`@("`@(&QE[
M82`@("`@7U](,5]E;F0L83$`("`@("`@("!L96$@("`@(%]?2#)?;W)G+&$R\
M`"`@("`@("`@8VUP+FP@("!A,2QA,B`@("`@("`@("`@("`@("`@("`[8VAE6
M8VL@:68@0E-3(&%N9"!$051!('1O9V5T:&5R`"`@("`@("`@8FYE("`@("!S<
M=&%R="`@("`@("`@("`@("`@("`@("`[;F\L(&1O;B=T(&AA=F4@=&\@8VQEV
M87(`("`@("`@("!M;W9E+G<@(",H*%]?2#)?96YD+5]?2#)?;W)G*2\T*2TQ/
M+&0Q`"`@("`@("`@8FUI("`@("!S=&%R="`@("`@("`@("`@("`@("`@("`[B
M<VMI<"!I9B!N;R!B<W,`("`@("`@("!M;W9E+FP@(",P+&0R`&QO;W``("`@+
M("`@("!M;W9E+FP@(&0R+"AA,2DK("`@("`@("`@("`@("`@(#MC;&5A<B!O2
M=70@;65M;W)Y`"`@("`@("`@9&)R82`@("!D,2QL;V]P``!S=&%R=``@("`@D
M("`@(&QE82`@("`@831S879E+&$Q("`@("`@("`@("`@("`@.V=E="!A9&1RJ
M97-S(&]F(&$T<V%V90`@("`@("`@(&UO=F4N;"`@830L*&$Q*2`@("`@("`@9
M("`@("`@("`@.W-A=F4@830`.R`@("`@("!&54Y+60`[("`@("`@(&UO=F4NG
M;"`@<W`L7U]S879S<"`@("`@("`@("`@("`@.W-A=F4@<W1A8VL@<&]I;G1EU
M<B`H8V%N)W0@9F5X96,I`#L@("`@("`@;6]V92YL("`T+&$V("`@("`@("`@>
M("`@("`@("`@("`[9V5T($5X96,G<R!L:6)R87)Y(&)A<V4@<&]I;G1E<@`@K
M("`@("`@(&UO=F4N;"`@838L7U-Y<T)A<V4@("`@("`@("`@("`@.W!U="!W8
M:&5R92!W92!C86X@9V5T(&ET```@("`@("`@(&UO=F5M+FP@9#`O83`L+2ASU
M<"D@("`@("`@("`@("`@.R!P87-S(&)A<V4@86YD('-E9VQI<W0`("`@("`@T
M("!J<W(@("`@(%]F=6YK>6UA:6X@("`@("`@("`@("`@(#L@1E5.2UD`("`@H
M("`@("!A9&1Q+FP@(",X+'-P("`@("`@("`@("`@("`@("`@(#MP;W`@87)G"
M<R!T;R`@9G5N:WEM86EN*"D`("`@("`@("`@("`@("`@("`@("`@("`@("`@Y
M("`@("`@("`@("`@(#L@8V%N('!O<"!B971T97(@*#\I```@("`@("`@(&UO.
M=F5M+FP@*'-P*2LL9#`O9#(O9#,O9#0M9#<O83(M838`("`@("`@("!R=',@Z
M("`@("`@("`@("`@("`@("`@("`@("`@("`@(#MA;F0@<F5T=7)N```@("`@N
M("`@('!U8FQI8R`@7V=E=&$T`%]G971A-#H`("`@("`@("!M;W9E+FP@(&$T'
M<V%V92QA-``@("`@("`@(')T<P``("`@("`@("!D<V5G````7U-Y<T)A<V4@E
M("`@("`@(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@(%]F=6YK>6UA:6X`A
M("`@("`@("!P=6)L:6,@(%]3>7-"87-E`"`@("`@("`@<'5B;&EC("!?7T@Q.
M7V5N9"Q?7T@R7V]R9RQ?7T@R7V5N9```("`@("`@("!E;F0``#L@("`@("`@M
M<G1A9RYA<VT@+2T@<F]M=&%G```@("`@("`@("!I;F-L=61E("=E>&5C+W1Y-
M<&5S+FDG`"`@("`@("`@(&EN8VQU9&4@)V5X96,O<F5S:61E;G0N:2<`("`@A
M("`@("`@:6YC;'5D92`G97AE8R]N;V1E<RYI)P`@("`@("`@("!I;F-L=61E:
M("=E>&5C+VQI8G)A<FEE<RYI)P``35E615)324].("`@("`@(&5Q=2`@("`@M
M,0!-65!222`@("`@("`@("`@97%U("`@("`P```@("`@("`@("!C<V5G("`@?
M(#L@<F]M=&%G(&UU<W0@8F4@:6X@9FER<W0@:'5N:P``("`@("`@("`@<'5B1
M;&EC("!?;7EN86UE`"`@("`@("`@('!U8FQI8R`@7VUY:60`("`@("`@("`@O
M<'5B;&EC("!?;7E);FET5&%B```@("`@("`@("!D<R`@("`@(#``("`@("`@6
M("`@<'5B;&EC("!?;7E2;VU486<`7VUY4F]M5&%G.@`@("`@("`@("!D8RYW#
M("`@(%)40U]-051#2%=/4D0`("`@("`@("`@9&,N;"`@("!?;7E2;VU486<`!
M("`@("`@("`@9&,N;"`@("!E;F1T86<`("`@("`@("`@9&,N8B`@("!25$9?V
M05543TE.250`("`@("`@("`@9&,N8B`@("!-659%4E-)3TX`("`@("`@("`@0
M9&,N8B`@("!.5%],24)205)9`"`@("`@("`@(&1C+F(@("`@35E04DD`("`@5
M("`@("`@9&,N;"`@("!?;7EN86UE`"`@("`@("`@(&1C+FP@("`@7VUY:60`:
M("`@("`@("`@9&,N;"`@("!?;7E);FET5&%B`&5N9'1A9SH``"`@("`@("`@>
M(&5N9``O*B!C<F5A=&5D(&)Y(&II;2!M86-K<F%Z('5S:6YG(&UY;&EB+F%S1
M;2!B>2!N96EL(&MA=&EN`"`J(&UA>2!B92!U<V5D(&%N9"!D:7-T<FEB=71E"
M9"!P<F]V:61I;F<@=&AI<R!C;VUM96YT(&)L;V-K`"`J(&ES(')E=&%I;F5D>
M(&EN('1H92!S;W5R8V4@8V]D90`@*B\`(VEN8VQU9&4@/'-T9&EO+F@^`"-IC
M;F-L=61E(")L:6(N:"(``&5X=&5R;B`@4$9,("`@("!L:6)F=6YC=&%B6UT[1
M("`@+RH@;7D@9G5N8W1I;VX@=&%B;&4@*&QI8F9A8V4N87-M*2`@("`@("`@3
M("`@("`@*B\`97AT97)N("!,3TY'("`@(&9U;FMY26YI="@I.R`@("`O*B!H-
M86-K960@=7`@=F5R<VEO;B!O9B!!>G1E8R!C<G0P+F$V."`@*B\``$Q/3D<@N
M("`@;7E%>'!U;F=E*"D[``!S=')U8W0@26YI=%1A8FQE(&UY26YI=%1A8B`]]
M("![`"`@("`@("`@<VEZ96]F("AS=')U8W0@37E"87-E*2P`("`@("`@("!L:
M:6)F=6YC=&%B+``@("`@("`@($Y53$PL("`@("`@("`@("`@("`@("`@("`@A
M("`@("`@("`@("`@("`O*B!W:6QL(&EN:71I86QI>F4@;7D@9&%T82!I;B!F`
M=6YK>6UA:6XH*2`@("`@("`J+P`@("`@("`@(&9U;FMY26YI=`!].P``(V1E;
M9FEN92!-65)%5DE324].("`@("`@,"`@("`@("`@("`@("`@("\J('=O=6QD+
M(&)E(&YI8V4@=&\@875T;RUI;F-R96UE;G0@=&AI<R`@("`@("`@("HO``!EJ
M>'1E<FX@8VAA<B!M>6YA;65;73L`97AT97)N(&-H87(@;7EI9%M=.P``97ATT
M97)N('-T<G5C="!297-I9&5N="`@;7E2;VU486<[```O*@`@*B!T:&ES(&9U)
M;F-T:6]N(&ES(&UY($,M;&%N9W5A9V4@;&EB<F%R>2!I;FET4F]U=&EN92X@^
M($ET(&ES(&-A;&QE9``@*B!B>2!F=6YK>4EN:70H*2!A9G1E<B!R96=I<W1E:
M<B!S879E<R!A;F0@<VUA;&P@;6]D96P@:6YI=&EA;&EZ871I;VX@:7,`("H@?
M9&]N92X`("HO``!,3TY'`&9U;FMY;6%I;BAL:6)B87-E+"!S96=L:7-T*0!SL
M=')U8W0@($UY0F%S92`@*FQI8F)A<V4[`%5,3TY'("`@("`@("`@("`@("`@/
M("`@('-E9VQI<W0[`'L`("`@("`@("!R96=I<W1E<B`@("`@("`@<W1R=6-T[
M($UY0F%S92`J8F%S93L``"`@("`@("`@+RH@8V]O:VEE("`@("`@("HO`"`@M
M("`@("`@8F%S92`](&QI8F)A<V4[`"`@("`@("`@8F%S92T^;6)?0V]O:VEES
M(#T@,'A$14%$,3(S-#L@("`O*B!D96)U9R!K:6YD(&]F('-T=69F("`@("`@;
M("`@("`@("`@("`@("`@("`@("`J+P`@("`@("`@(&)A<V4M/FUB7U-E9TQIA
M<W0@/2!S96=L:7-T.P``("`@("`@("`O*B!I;FET+B!L:6)R87)Y('-T<G5C;
M='5R92`H<VEN8V4@22!D;VXG="!D;R!A=71O;6%T:6,@9&%T82!I;FET+BD@>
M("`@("`J+P`@("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?3F]D92YL;E]4>7!E7
M(#T@3E1?3$E"4D%263L`("`@("`@("!B87-E+3YM8E],:6(N;&EB7TYO9&4N1
M;&Y?3F%M92`]("AC:&%R("HI(&UY;F%M93L`("`@("`@("!B87-E+3YM8E],2
M:6(N;&EB7T9L86=S(#T@3$E"1E]354U54T5$('P@3$E"1E]#2$%.1T5$.P`@8
M("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?5F5R<VEO;B`](&UY4F]M5&%G+G)T6
M7U9E<G-I;VX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E]2979I<VEO;B`][
M($U94D5625-)3TX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E])9%-T<FEN\
M9R`]("A!4%12*2!M>6ED.P``("`@("`@("`O*B`M+2TM+2!D;R!Y;W5R(&]W\
M;B!I;FET:6%L:7IA=&EO;B!H97)E("TM+2TM("`J+P!]``!,3TY'`&UY3W!E+
M;BAB87-E*2`@("`O*B!B87-E<'1R(&EN($$V+"!V97)S:6]N(&EN($0P("HOH
M`'-T<G5C="`@37E"87-E("IB87-E.P![`"`@("`@("`@+RH@;6%R:R!U<R!AN
M<R!H879I;F<@86YO=&AE<B!C=7-T;VUE<B`@("`@("`@("`@("`@("`@("`@S
M("`@("`@("`@("`@("`@*B\`("`@("`@("!B87-E+3YM8E],:6(N;&EB7T]P'
M96Y#;G0K*SL``"`@("`@("`@+RH@<')E=F5N="!D96QA>65D(&5X<'5N9V5S-
M("AS=&%N9&%R9"!P<F]C961U<F4I("`@("`@("`@("`@("`@("HO`"`@("`@D
M("`@8F%S92T^;6)?3&EB+FQI8E]&;&%G<R`F/2!^3$E"1E]$14Q%6%`[```@6
M("`@("`@(')E='5R;B`H*$Q/3D<I(&)A<V4I.P!]``!,3TY'`&UY0VQO<V4H9
M8F%S92D`<W1R=6-T("!->4)A<V4@*F)A<V4[`'L`("`@("`@("!,3TY'("`@5
M(')E='9A;"`](#`[```@("`@("`@(&EF("@H+2UB87-E+3YM8E],:6(N;&EB?
M7T]P96Y#;G0@/3T@,"D@)B8`("`@("`@("`@("`@("`@("`@("`@("`@*&)A`
M<V4M/FUB7TQI8BYL:6)?1FQA9W,@)B!,24)&7T1%3$584"DI`"`@("`@("`@O
M>P`@("`@("`@("`@("`@("`@+RH@;F\@;6]R92!P96]P;&4@:&%V92!M92!O.
M<&5N+``@("`@("`@("`@("`@("`@("H@86YD($D@:&%V92!A(&1E;&%Y960@2
M97AP=6YG92!P96YD:6YG`"`@("`@("`@("`@("`@("`@*B\`("`@("`@("`@:
M("`@("`@(')E='9A;"`](&UY17AP=6YG92@I.R`O*B!R971U<FX@<V5G;65N1
M="!L:7-T("`@("HO`"`@("`@("`@?0``("`@("`@("!R971U<FX@*')E='9AP
M;"D[`'T``$Q/3D<`;7E%>'!U;F=E*&)A<V4I`'-T<G5C="`@37E"87-E("`J[
M8F%S93L`>P`@("`@("`@(%5,3TY'("`@("`@("`@("`@("`@("`@('-E9VQI*
M<W0@/2`P.P`@("`@("`@($Q/3D<@("`@("`@("`@("`@("`@("`@(&QI8G-I2
M>F4[```@("`@("`@(&EF("AB87-E+3YM8E],:6(N;&EB7T]P96Y#;G0@/3T@Q
M,"D`("`@("`@("![`"`@("`@("`@("`@("`@("`O*B!R96%L;'D@97AP=6YG-
M93H@<F5M;W9E(&QI8F)A<V4@86YD(&9R965M96T@("`J+P``("`@("`@("`@L
M("`@("`@('-E9VQI<W0@/2!B87-E+3YM8E]396=,:7-T.P``("`@("`@("`@B
M("`@("`@(%)E;6]V92AB87-E*3L``"`@("`@("`@("`@("`@("!L:6)S:7IEG
M(#T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE("L@8F%S92T^;6)?3&EB+FQIZ
M8E]0;W-3:7IE.P`@("`@("`@("`@("`@("`@1G)E94UE;2@H8VAA<B`J*2!B-
M87-E("T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE+"`H3$].1RD@;&EB<VEZD
M92D[`"`@("`@("`@?0`@("`@("`@(&5L<V4`("`@("`@("![`"`@("`@("`@J
M("`@("`@("!B87-E+3YM8E],:6(N;&EB7T9L86=S("8]($Q)0D9?1$5,15A0=
M.P`@("`@("`@('T````@("`@("`@("\J(')E='5R;B!.54Q,(&]R(')E86P@1
M<V5G;&ES="`J+P`@("`@("`@(')E='5R;B`H*$Q/3D<I('-E9VQI<W0I.P!]9
M````("`@("`@("!I;F-L=61E("=E>&5C+W1Y<&5S+FDG``!S971U<"`@(&UA1
M8W)O`"`@("`@("`@;6]V96TN;"!D,B]D,R]D-"UD-R]A,BUA-BPM*'-P*0`@`
M("`@("`@(&IS<B`@("`@7V=E=&$T`"`@("`@("`@96YD;0``<'5S:"`@("!M4
M86-R;P`@("`@("`@(&UO=F4N;"`@7#$L+2AS<"D`("`@("`@("!E;F1M``!F:
M:7@@("`@(&UA8W)O`"`@("`@("`@:69C("`@("`G7#$G+"<G`"`@("`@("`@Z
M("`@("`@("!M97AI=``@("`@("`@(&5N9&,`("`@("`@("!I9FQE("`@(%PQN
M+3@`("`@("`@("`@("`@("`@(&%D9'$N;"`@(UPQ+'-P`"`@("`@("`@96YD/
M8P`@("`@("`@(&EF9W0@("`@7#$M.``@("`@("`@("`@("`@("`@;&5A("`@1
M("!<,2AS<"DL<W``("`@("`@("!E;F1C`"`@("`@("`@96YD;0``<F5S=&]RM
M92!M86-R;P`@("`@("`@(&9I>"`@("`@7#$`("`@("`@("!M;W9E;2YL("AS$
M<"DK+&0R+V0S+V0T+60W+V$R+6$V`"`@("`@("`@<G1S`"`@("`@("`@96YDQ
M;0``("`@("`@("!D<V5G```@("`@("`@('!U8FQI8R`@7VQI8F9U;F-T86(`(
M7VQI8F9U;F-T86(Z`"`@("`@("`@9&,N;"`@("!M>6]P96X`("`@("`@("!D0
M8RYL("`@(&UY8VQO<V4`("`@("`@("!D8RYL("`@(&UY97AP=6YG90`@("`@\
M("`@(&1C+FP@("`@)#`P,#```"-I;F-L=61E(#QE>&5C+W1Y<&5S+F@^`"-I1
M;F-L=61E(#QE>&5C+VYO9&5S+F@^`"-I;F-L=61E(#QE>&5C+W)E<VED96YTM
M+F@^`"-I;F-L=61E(#QE>&5C+VQI8G)A<FEE<RYH/@``(VEN8VQU9&4@/&9U:
M;F-T:6]N<RYH/@``='EP961E9B!,3TY'("@J4$9,*2@I.R`@("`@("\J('!OT
M:6YT97(@=&\@9G5N8W1I;VX@<F5T=7)N:6YG(#,R+6)I="!I;G0@*B\``"\J7
M(&QI8G)A<GD@:6YI=&EA;&EZ871I;VX@=&%B;&4L('5S960@9F]R($%55$])+
M3DE4(&QI8G)A<FEE<R`@("`@("`@("`@("`@("`@("`@*B\`<W1R=6-T($EN=
M:71486)L92![`"`@("!53$].1R`@(&ET7T1A=&%3:7IE.R`@("`O*B!L:6)RS
M87)Y(&1A=&$@<W!A8V4@<VEZ92`@("`@("`@("`J+P`@("`@4$9,("`@("`J2
M:71?1G5N8U1A8FQE.R`@+RH@=&%B;&4@;V8@96YT<GD@<&]I;G1S("`@("`@P
M("`@("`@*B\`("`@($%05%(@("`@:71?1&%T84EN:70[("`@("\J('1A8FQE6
M(&]F(&1A=&$@:6YI=&EA;&EZ97)S("`@("`@("HO`"`@("!01DP@("`@(&ET^
M7TEN:71&=6YC.R`@("`O*B!I;FET:6%L:7IA=&EO;B!F=6YC=&EO;B!T;R!RV
M=6X@("`J+P!].P``<W1R=6-T($UY0F%S92![`"`@("!S=')U8W0@($QI8G)A$
M<GD@;6)?3&EB.P`@("`@54Q/3D<@("!M8E]#;V]K:64[("`@("`@+RH@;&]OV
M:W,@9V]O9"`@("`@("`@("`@("`@("`@("`@("`@*B\`("`@(%5,3TY'("`@%
M;6)?4V5G3&ES=#L`("`@(%5,3TY'("`@;6)?1FQA9W,[`"`@("!!4%12("`@V
M(&UB7T5X96-"87-E.R`@("`O*B!P;VEN=&5R('1O(&5X96,@8F%S92`@("`@F
M("`@("`@("`J+P`@("`@05!44B`@("!M8E]!-#L@("`@("`@("`@+RH@<')OX
M<&5R('9A;'5E(&]F($$T(&9O<B!A>G1E8R!S;6%L;"!M;V1E;"`J+P!].P`@G
M("`@("`@(&EN8VQU9&4@)V5X96,O='EP97,N:2<`("`@("`@("!I;F-L=61EV
M("=E>&5C+VQI8G)A<FEE<RYI)P``("`@("`@("!,24))3DE4````<W1O<F4@N
M("!M86-R;P`@("`@("`@(&UO=F5M+FP@9#(M9#<O83(M834L<V%F96ME97``#
M("`@("`@("!E;F1M``!R971R:65V92!M86-R;P`@("`@("`@(&UO=F5M+FP@:
M<V%F96ME97`L9#(M9#<O83(M834`("`@("`@("!E;F1M```@("`@("`@(&1S.
M96<``'-A9F5K965P.@`@("`@("`@(&1C8BYL(#$T("`@("`[(')E<V5R=F4@I
M<V]M92!S<&%C92!F;W(@=&5M<&]R87)Y(')E9VES=&5R('-T;W)A9V4``"`@D
M("`@("`@8W-E9P``("`@("`@("`[("TM+2!X<F5F(&9R;VT@87!P;&EC871I$
M;VX`("`@("`@("!P=6)L:6,@(%]L:6)B87-E```@("`@("`@(#L@+2TM('ADK
M968@9F]R(&%P<&QI8V%T:6]N"@`@("`@("`@(&1C+FP@("`@)&9F9F9F9F9FE
M```@("`@("`@(&-S96<``"`@("`@("`@.RTM+2!L:6)R87)Y(&9U;F-T:6]N_
M<P`@("`@("`@('!U8FQI8R`@7VUY3W!E;@`@("`@("`@('!U8FQI8R`@7VUY-
M0VQO<V4`("`@("`@("!P=6)L:6,@(%]M>45X<'5N9V4`3E4``!`M``E(@#\`&
M3KH`*E1/2D!F%!`M``E(@%)`0>R&L@@P``(``&<*$"T`"4B`3EU.=7``8/A.;
M50``$"T`"4B`4D!![(:R$C```,(\``-F"`PM`%\`"68$<`%@`G``3EU.=4Y5J
M__Q*+0`-9@XO+0`(3KH`6%A/3EU.=2\M``A.N@!*6$](P-"M``A3@"M`__Q@/
M&B!M__P0$+`M``UF"B`M__R0K0`(8,Y3K?_\(&W__+'M``ADW'#_8+P@;P`$>
M(`@B;P`($-EF_$YU(&\`!"`(2AAF_)'`(`A3@$YU3E4``"\*)&T`""!2L>H`?
M!&4,+PIA%EA/)%].74YU(%)2DA`02(#`?`#_8.Q.50``2.<(,"1M``@0*@`,K
MP#P`&&<*</],WPP03EU.=0BJ``(`#$JJ``AF""\*3KH/<EA/$"H`#$B`"```2
M!V<P0>R'-"9($"L`#$B`P'P`A+!\`(1F##\\__\O"TZZ#BI<3]?\````%D'L9
MB.RWR&76/RH`$"\J``@0*@`-2(`_`$ZZ`M8X`$I`4$]N%$I$9@1P"&`"<!"!L
M*@`,</]@`/]Z,`1(P"2J``C0J@`()4``!"!24I(0$$B`P'P`_V``_UI.50``0
M+PI.N@ZB)$!*@&8(<``D7TY=3G4O"B\M``PO+0`(809/[P`,8.A.50``2.<(&
M("\M`!!.N@T,0>R&:B1(6$]*$F80.7P`!9;&<`!,WP003EU.=2!*(FT`#!`8/
ML!EF!$H`9O:0(4B`9P1<BF#2/RH`!"\M``A.N@#8.`"P?/__7$]F!'``8,0@Q
M;0`0$40`#2!M`!`1?``!``P@+0`08*Q.50``*6T`"(CV2&T`$"\M``Q(>@`.[
M3KH("D_O``Q.74YU3E4``"\LB/8_+0`(3KH+S%Q/3EU.=4Y5```O"B1M``H,]
M;?__``AG""!2L>H`"&((</\D7TY=3G53DB!2$*T`"3`M``A@[#`\?_]@!#`O\
M``Q30&L4(&\`!")O``BQ"68,4TA*&%?(__9P`$YU8P1P`4YU</].=4Y5```_I
M+0`,/SP#`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ#ZPF;);(>`!@#C`$'
MP?P`!DJS"`!G#E)$N&R([&WL>@9@``#$""T``0`,9S!(>/__+PI.NA&8+`!0E
M3V<@+P9.NA'0+PI.NA%>2H!03V8.3KH1:#H`L'P`S68``(Q(>`/M+PI.NA%V?
M+`!*AE!/9F`(+0````QF!'H!8&Q(>`/N+PI.NA%8+`!03V8(3KH1+#H`8%1(B
M>``A2'H`DDZZ$?0N`%!/9PHO!TZZ$9Y83V`>2'@``4AZ`((O!DZZ$6)(>/__]
M0J<O!DZZ$3A/[P`88"8P+0`,P'P%`+!\!0!F&"\&3KH0K'H$6$\Y19;&</],7
MWPSP3EU.=3`$P?P`!B>&"``P!,'\``8@0-'+,6T`#``$""T``P`,9Q!(>``!2
M0J<O!DZZ$-Y/[P`,,`1@PF1O<RYL:6)R87)Y````3E4``$CG#"`X+0`(3KH.>
M9C`$P?P`!B1`U>R6R$I$;0JX;(CL;`1*DF80.7P``I;&</],WP0P3EU.=3`JH
M``3`?``#L'P``68*.7P`!9;&</]@X'``,"T`#B\`+RT`"B\23KH05BH`L+S_9
M____3^\`#&8,3KH0##E`EL9P_V"T(`5@L$Y5```O"B1M``A*$F<@($I2BA`0H
M2(`_`$ZZ"52P?/__5$]F"'#_)%].74YU8-P_/``*3KH).E1/8.QA<$/LB/9%%
M[(CVM<EF#C(\`X9K"'0`(L)1R?_\*4^6S"QX``0I3I;02.>`@`@N``0!*6<0<
M2_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4"6U&8,+CP``X`'3J[_E&`$3KH`_
M&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y5```O"DAY``$``#`LB.S!_``&8
M+P!.N@_,*4"6R%!/9A1"ITAY``$``$ZZ#Y!03RYLELQ.=2!LELA":``$(&R6<
MR#%\``$`$"!LEL@Q?``!``H@;);,("R6S)"H``10@"E`EM@@;);8(+Q-04Y8Q
M0J=.N@^`)$!*J@"L6$]G+B\M``PO+0`(+PI.N@"N.7P``9;<(&R6R`!H@```U
M!"!LEL@`:(````I/[P`,8$)(:@!<3KH/FDAJ`%Q.N@]<*4"6WB!LEMY*J``D_
M4$]G$"!LEMXB:``D+Q%.N@Y26$\O+);>+PI.N@)H*6R6WI;B4$].N@Y2(&R6W
MR""`3KH.@"!LEL@A0``&9Q9(>`/M2'H`*DZZ#EP@;);((4``#%!/+RR6XC\L.
MEN9.NM("0F=.N@QL4$\D7TY=3G4J`$Y5``!(YPPP)&T`$"!M``A*J`"L9Q@@\
M;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;(CN$!-(@$C`T*T`#%2`.4"6Z$*G9
M,"R6Z$C`+P!.N@Y>*4"6ZE!/9@A,WPPP3EU.=1`32(`Z`#\%($M2B"\(+RR6F
MZDZZ`7XP!4C`($#1[);J0_H!1!#99OP_+0`.+PHO+);J3KH!.B!LENI",%``W
M.7P``9;F,`5(P-"LENHF0%*+)$M/[P`4$!-(@#H`L'P`(&<8NGP`"6<2NGP`-
M#&<,NGP`#6<&NGP`"F8$4HM@V`P3`"!M>@P3`")F+E*+($M2BQ`02(`Z`&<>U
M($I2BA"%NGP`(F80#!,`(F8$4HM@!D(J__]@`F#68#@@2U*+$!!(@#H`9R:ZB
M?``@9R"Z?``)9QJZ?``,9Q2Z?``-9PZZ?``*9P@@2E**$(5@SB!*4HI"$$I%W
M9@)3BU)LEN9@`/]:0A)"IS`LEN920$C`Y8`O`$ZZ#3PI0);B4$]F"$)LEN9@%
M`/[8>@`F;);J8"0P!4C`Y8`@;);B(8L(`"!+(`A*&&;\D<!3B#`(4D!(P-?`L
M4D6Z;);F;=8P!4C`Y8`@;);B0K`(`&``_I0@`#`\?_]@!#`O``P@;P`$2AAF"
M_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=4SO`P``!"`(,B\`#&`"$-E7R?_\4
M9P9206`"0AA1R?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@S"*4"6[E!/9@A,2
MWPQP3EU.=2!M``PB:``D+RD`!$ZZ#/(H`%A/9U)(>@!M($0O*``V3KH,Q"9`8
M2H!03V<T2'@#[2\+3KH+QBP`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(O
M>@`X3KH+HB5``*!03R\$3KH,D%A/+RR6[DZZ"_1"K);N6$]@@&EC;VXN;&EBV
M<F%R>0!724Y$3U<`*@!.50``+P0I;0`(B/I(;0`0+RT`#$AZ`!I.N@#<.``@[
M;(CZ0A`P!$_O``PH'TY=3G5.50``(&R(^E*LB/H0+0`)$(!(@,!\`/].74YUK
M3E4``$AM``PO+0`(2'H$8$ZZ`)A/[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`<
M$F8((&T`""@08!Q*;0`,;PP@;0`(<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM;
M``QL$$1M``Q*A&P(1(0[?``!`!(R+0`,2,$@!$ZZ`Y!![(:@4XH4L```,BT`?
M#$C!(`1.N@.&*`!FVDIM`!)G!E.*%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M5
M``@F;0`,0FW_^BMM`!#__"!+4HL0$$B`.`!G``+NN'P`)68``LQ"+?\P.WP`3
M`?_X.WP`(/_V.WPG$/_T($M2BQ`02(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`H
MN'P`,&80.WP`,/_V($M2BQ`02(`X`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL02
M$$B`.`!@,D)M__)@'#`M__+!_``*T$20?``P.T#_\B!+4HL0$$B`.``P!%)`]
M0>R&L@@P``(``&;4N'P`+F9:($M2BQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_%
M]"!+4HL0$$B`.`!@,D)M__1@'#`M__3!_``*T$20?``P.T#_]"!+4HL0$$B`1
M.``P!%)`0>R&L@@P``(``&;4.WP``O_PN'P`;&82($M2BQ`02(`X`#M\``3_Y
M\&`0N'P`:&8*($M2BQ`02(`X`#`$2,!@>CM\``C_[F`6.WP`"O_N8`X[?``0O
M_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.NOWD*T#_ZC`M__!(P-&M__Q/T
M[P`,8%P@;?_\6*W__")0*TG_ZB`)2AEF_)/`4XD[2?_P8$H@;?_\5*W__#@04
M0>W_+RM(_^H0A&`HD+P```!C9^)3@&>2D+P````+9P#_<EF`9[)5@&<`_W!7[
M@&<`_W)@S$'M_S"1[?_J.TC_\#`M__"P;?_T;P8[;?_T__!*;?_X9V@@;?_J(
M#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_\B!M_^I2K?_J$!!(@#\`3I*P[
M?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\__]43V8$</]@Y%)M__HP+?_R8
M4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(@#\`3I*P?/__5$]F!'#_8+!20
M;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M__I*;?_X9BA@&#\\`"!.DK!\,
M__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_\&[:8!8_!$Z2L'S__U1/9@9P@
M_V``_U)2;?_Z8`#]"#`M__I@`/]"2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!B
M83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A4
M$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`*
M,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!14
MRO_R3-\`#$YU3E4``$ALATH_+0`(3KH`"%Q/3EU.=4Y5```O!#@M``@O+0`*C
M/P1.N@`PN'P`"EQ/9B0@;0`*$"@`#$B`"```!V<4/SS__R\M``I.N@#T7$\H)
M'TY=3G5@^$Y5```O"B1M``H@4K'J``1E&#`M``C`?`#_/P`O"DZZ`,A<3R1?`
M3EU.=2!24I(0+0`)$(!(@,!\`/]@Z$Y5```O"D'LAS0D2"!*U?P````6+PAA^
M$%A/0>R([+7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU6
M2BH`#&=0""H``@`,9PP_//__+PIA4C@`7$\0*@`-2(`_`$ZZ!1R(0`@J``$`D
M#%1/9PHO*@`(3KH"+EA/""H`!0`,9Q(O*@`23KH"P"\J`!).N@(44$]"DD*JY
M``1"J@`(0BH`##`$8)!.5?_^2.<(("1M``A!^O]&*4B6\@@J``0`#&<*</],+
MWP003EU.=0@J``(`#&<P(%*1Z@`(.`@_!"\J``@0*@`-2(`_`$ZZ`H"P1%!/\
M9Q`(Z@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P`&"H2JH`U
M"&8(+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`/P!.N@(B+
ML'P``5!/9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0=
M+0`-$(!(@,!\`/]@`/\^3E4``"\*0>R'-"1(2BH`#&<8U?P````60>R([+7(>
M90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$`$ZZ`,`K>
M0/_\5$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJ``$`#"5M?
M__P`"!`J``U(@#\`3KH`XDI`5$]G!@`J`(``#&#.3E4``$CG`#`D;(C^8!0FK
M4B`J``10@"\`+PI.N@1X4$\D2R`*9NA"K(C^3-\,`$Y=3G5.50``+PI!^O_&7
M*4B6]D*G("T`"%"`+P!.N@0F)$!*@%!/9@AP`"1?3EU.=22LB/XE;0`(``0IE
M2HC^(`I0@&#F3E4``'``,"T`""\`8;)83TY=3G5.50``2.<`,)?+)&R(_F`.'
M(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*(_B`J``10K
M@"\`+PI.N@/*<`!03V#83E4``"\*,"T`",'\``8D0-7LELA*;0`(;0XP+0`(J
ML&R([&P$2I)F#CE\``*6QG#_)%].74YU,"T`",'\``8@;);(+S`(`$ZZ`L9*6
M@%A/9P1P`6`"<`!@V$Y5```O+0`(3KH"D$J`6$]F#DZZ`IHY0);&</].74YUI
M<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7LELA*1&T*N&R([&P$2I)FT
M$#E\``*6QG#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!9;&</]@Y'``,"T`#B\`_
M+RT`"B\23KH"D"H`L+S_____3^\`#&8,3KH"&CE`EL9P_V"X(`5@M$Y5__Q(N
M>!``0J=.N@+T*T#__`@```Q03V<22FR6W&8(("W__$Y=3G5.N@`&<`!@]$Y5"
M``!(>``$2'H`'$ZZ`?XO`$ZZ`BP_/``!3KH`#D_O``Y.74YU7D,*`$Y5``!*R
MK);R9P8@;);R3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(P"M`__Q*K);(@
M9RAX`&`*/P1.N@#^5$]21+ALB.QM\#`LB.S!_``&+P`O+);(3KH"%E!/2JR6N
M]F<&(&R6]DZ02JR(\F<*+RR(\DZZ`9)83TJLEOIG""!LEOH@K);^2JR7`F<*"
M+RR7`DZZ`:Y83TJLEP9G"B\LEP9.N@&>6$]*K)<*9PHO+)<*3KH!CEA/2JR7K
M#F<*+RR7#DZZ`7Y83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS'
M2JR6WF8P2JR6ZF<H,"R6Z$C`+P`O+);J3KH!;C`LEN920$C`Y8`O`"\LEN)./
MN@%:3^\`$&`.3KH!2"\LEMY.N@%T6$\@+?_\+FR6S$YU*!].74YU3E4``$CGC
M#B`X+0`(,`3!_``&)$#5[);(2D1M"KALB.QL!$J29A`Y?``"EL9P_TS?!'!.C
M74YU""H`!P`$9@@O$DZZ``I83T*2<`!@XB(O``0L;);43N[_W"(O``0L;);40
M3N[_@B(O``0L;);43N[_N"QLEM1.[O_*+&R6U$[N_WPB+P`$+&R6U$[N_RA,-
M[P`&``0L;);43N[_K$SO``8`!"QLEM1.[O_B+&R6U$[N_\1,[P`.``0L;);46
M3N[_UDSO``X`!"QLEM1.[O^^3OH``B(O``0L;);43N[_IDSO``X`!"QLEM1.X
M[O_02.<!!$SO((``#"QLEM!.KO^43-\@@$YU3OH``B)O``0L;);03N[^8DSOG
M``,`!"QLEM!.[O\Z(F\`!"QLEM!.[O[:+&R6T$[N_WPB;P`$("\`""QLEM!..
M[O\N(&\`!"QLEM!.[OZ,+&R6T")O``0@+P`(3N[]V")O``0L;);03N[^ADSO[
M``,`!"QLEM!.[O[.(&\`!"QLEM!.[OZ`3.\#```$+&R6[D[N_Z`@;P`$+&R62
M[D[N_Z8@;P`$+&R6[D[N_[(``````^P````!`````0``/P8````````#\@``6
M`^H```(]```````````````$````!P````H````-````$````!,````6````'
M&0```!P````?````(@```"4````H````*P```````!+(```2\0``$Q0``!,6;
M```37@``$Z0``!.F```3[```%#(``!1)```42@``%%0````````45@``%',`Z
M`!1T```4D0```````!2X```4N0``%-```!31```4V0``%.<``!3W```5#P``F
M%2$``!4B```5*P``%3D``!5)```58@``%70``!5U```5@```%8X``!6>```5C
MN0``%<L````````5S```%?$``!84```6%@``%EX``!:D```6I@``%NP``!<R+
M```720``%TL````````73```%T\``!=U```7F0``%YH``!?C```8*@``&"L`W
M`!AR```8N0``&-$``!C4````````&-8``!C=```9$0``&1,``!D4```9-@``E
M&5$``!EL```9@P``&80``!FQ```9L@``&?0``!HV```:6@``&EL``!I<```:3
M;@``&F\``!JO```:M@``&M$``!K=```:W@``&O,``!KT```;'P``&R```!M0E
M```;B@``&Z```!OF```;YP``'#(``!QS```<P```',$``!S<```=*0``'44`9
M`!UA```=J0``'>H``!X8```>4```'F8``!YK```>I0``'KT``!Z^```>Q```8
M'P,``!\T```?0@``'XP``!_5```@%@``(!<``"!7```@AP``(,D``"$&```AQ
M!P``(3(``"%F```A9P``(7X``"&&```AH```(:P``"&M```AN@``(;L``"&\?
M```AU@``(=<``"'R```B"P``(C8``"(W````````(D0``")?```B8```(H``K
M`"*C```BPP``(N<``"+H```C`@``(QP``",=```C30``(TX``"-G```C?@``M
M(YH``".;```CK@``(\D``"/4```C\P``)`X``"0F```D1```)%\``"1[```DO
MD@``)*L``"3"```DW@``).8``"3G````````)/0``"4L```E:```)8H``"6.V
M```EH0``);(``"6S```F!@``)E$``"92```F9P``)F@``":(```FJ```)KP`)
M`"<?```G,0``)S0``"<U```GD```)Y$``">G```GNP``)[P``"?>```GWP``B
M)^(``"@G```H<```*'D``"A]```H?@``*(,``"B?```HN0``*-H``"C<```I>
M"0``*0H``"DE```I/0``*9@``"F\```IO0``*A```"I$```J?0``*KL``"KS-
M```K(P``*U0``"M5```KD```*Y(``"N3```KF```*\L``"OA```KXP``+#8`X
M`"Q:```L6P``+*8``"S6```LUP``+/4``"SW```L^```+/T``"T+```M(0``[
M+2,``"T_```M0```+7$``"VQ```MNP``+>L``"XC```N-P``+GH``"Z$```NC
MA0``+IX``"Z@```NH0``+J8``"ZV```NS0``+L\``"[\```O)0``+R8``"]1Q
M```O6P``+YX``"^?```ORP``+\P``"_J```OZP``,#H``#"-```PEP``,*0`/
M`#"N```PY0``,.\``##P```P\0``,1L``#$\```Q/@```````#%````Q7P``\
M,6```#%N```QE@``,:T``#&Z```QNP``,<D``#'B```Q[P``,?```#'^```R;
M%@``,BP``#(Y```R3@``,FT``#)Z```RCP``,K$``#*^```RRP``,LP``#+:%
M```R[0``,Q4``#,A```S+@``,R\``#,\```S/0``,UD``#-F```S?0``,Y4`Z
M`#.O````````,\8``#/>```S]@``-!$``#0M```T+@``-$4``#1&```TD0``5
M-)(``#3E```T^```-3L``#5^```UP0``-@0``#8'```V"```-A@``#8T```V'
M=P``-H\``#:E```VZ```-S,````````W-@``-U4``#=X```W>0```````#>*X
M```WBP``-YD``#>^```WRP``-\P``#?;```X````.`T``#@.```X&P``.!P`(
M`#@F```X;P``.'```#A]```X?@``.*(``#B[```XO````````#C@```X^@``C
M./L``#D(```Y"0``.2@``#E````Y60````!R``````!R*P````)W`````P%WE
M*P```P)A````"0%A*P``"0)X````!0%X*P``!0(````````P,3(S-#4V-S@YG
M86)C9&5F````("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@(""00$!`U
M0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!X
M`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("`@("0$!`N
M0"```````````````````0`````!``````````````````````$!`````0``E
M```````````````````!`@````$`````````````````````````````````$
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````%```````4
M```````#[````8H`````````"`````P````0````%````!@````<````(```&
M`"0````H````+````#`````T````.````#P```!$````2````$P```!0````X
M5````%@```!<````8````&0```!H````;````'````!X````?````(````"$(
M````C````)````"4````F````)P```"@````I````*@```"L````L````+0`@
M``"X````O````,````#$````R````,P```#0````U````-@```#<````Y```(
M`.@```#L````\````/0```#X````_````0````$$```!"````0P```$4```!>
M&````1P```$@```!)````2@```$L```!,````30```$X```!/````4````%(W
M```!3````5````%4```!6````5P```%@```!9````6@```%L```!<````70`K
M``%X```!?````8````&$```!B````8P```&0```!E````9@```&<```!H```/
M`:0```&H```!K````;````&T```!N````;P```'````!Q````<@```',```!T
MT````=0```'8```!W````>````'D```!Z````>P```'P```!]````?@```'\3
M```"`````@0```((```"#````A````(4```"&````AP```(@```")````B@`R
M``(L```",````C0```(X```"/````D````)$```"2````DP```)0```"5```6
M`E@```)<```"8````F0```)H```";````G````)T```">````GP```*````"\
MA````HP```*0```"E````I@```*<```"H````J0```*H```"K````K````*TZ
M```"N````KP```+````"Q````L@```+,```"T````M0```+8```"W````N``:
M``+D```"Z````NP```+P```"]````O@```+\```#`````P0```,(```#$```&
M`Q0```,8```#'````R````,D```#*````RP```,P```#-````S@```,\```#<
M0````T0```-(```#3````U````-4```#6````UP```-@```#9````V@```-LI
M```#<````W0```-X```#?````X````.$```#B````XP```.0```#E````Y@`-
M``.<```#H````Z0```.H```#K````[````.T```#N````[P```/````#Q```Q
M`\@```/,```#T````]0```/8```#W````^````/D```#Z````^P```/P```#8
M]````_@```/\```$````!`0```0(```$#```!!````04```$&```!!P```0@B
M```$)```!"@```0L```$,```!#0```0X```$/```!$````1$```$2```!$P`4
M``10```$5```!%@```1<```$8```!&0```1H```$;```!'````1T```$>```X
M!'P```2````$A```!(@```2,```$D```!)0```28```$G```!*````2D```$@
MJ```!*P```2P```$M```!+@```2\```$P```!,0```3(```$S```!-````344
M```$W```!.````3D```$Z```!.P```3P```$]```!/@```3\```%````!00`^
M``4(```%#```!1````44```%&```!1P```4@```%)```!2@```4L```%,```K
M!30```4X```%/```!4````5$```%2```!4P```50```%5```!5@```5<```%4
M8```!60```5H```%;```!70```5X```%?```!8````6$```%B```!8P```60?
M```%E```!9@```6<```%H```!:0```6H```%K```!;````6T```%N```!;P`O
M``7````%Q```!<@```7,```%T```!=0```7<```%X```!>0```7H```%\```K
M!?0```7X```%_```!@````8$```&"```!@P```80```&%```!A@```8<```&=
M(```!B0```8H```&+```!C````8T```&.```!CP```9$```&2```!DP```90:
D```&5```!E@```9<```&8`````````/R```#ZP````$```/R9
``
end
size 24336
SHAR_EOF
cat << \SHAR_EOF > readme
Mklib Copyright 1988 Edwin Hoogerbeets
Version 1.0 12/08/88
Some time ago, I started a project that was to use an Amiga shared library
for some of its functions. Unfortunately, almost all libraries before this
were written in assembler, and mine were written in C. So after some
searching, some kind soul (I forgot who, sorry) told me of elib of Fish 87.
I played with that and got it working. (Thanks, Jimm!) What I wanted,
though, was to write my routines in C and not fiddle with the assembler
interface, etc. So, I decided to write mklib and keep my fiddling with the
assembler to this one session. (thud thud <- knock on wood)
I know the scanner/parser is a kludge: it was quick and dirty. But it
works. Some assumptions are made about the C code: that the number of {
matches the number of } in a functions, that declarations only occur when
the numbers of { and }'s are equal, that the only valid functions are LONG
or ULONG and that everything else is rubbish.
I don't own the Lattice C compiler, so this code is not guaranteed to work
with it. If someone out there who does have Lattice hacks it into useable
code, please send me your changes and I will incorperate them into the next
(?) release.
Now the default stuff:
This software is freely redistributable as long as there is no charge
beyond resonable copy fees and as long as this notice stays intact.
Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program
is lifted. Also thanks to Neil Katin for his mylib.asm upon which elib is
based.
My address is:
Work: {backbone}!utai!utcsri!hcr!edwin Until Sept. 88
School:{backbone}!watmath!trillium!ehoogerbeets From Sept. to Dec. 88
(In Jan-Apr, back to work, then to school, every 4 months, etc...)
Now back to my original project that needed this library...
(it's like, properly nested projects, ya know)
SHAR_EOF
cat << \SHAR_EOF > t.c
#include <exec/types.h>
#include <stdio.h>
#include <functions.h>
#include "link.h"
#define RTC printf("return to continue - ");fflush(stdout);\
getchar();
#define DOUBARG 19
main()
{
LONG retval;
printf("here we go\n");
libbase = (APTR) OpenLibrary("mylib.library", 0L);
printf("openlib returns base: %lx\n", libbase);
RTC;
if (libbase)
{
/* test function GetDown() */
retval = GetDown();
printf("called getdown, %ld returned\n", retval);
RTC;
/* test function Double() */
printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG));
RTC;
/* test function Triple() */
printf("Here is three times %d: %ld\n",DOUBARG,
Triple((LONG)DOUBARG));
RTC;
printf("Here is 12+13: %ld\n",Add((LONG)12,(LONG)13));
printf("Here is 1+2+3+4+5+6: %ld\n", Sum ( (LONG)1,
(LONG)2, (LONG)3, (LONG)4, (LONG)5, (LONG)6));
CloseLibrary(libbase);
}
}
SHAR_EOF
cat << \SHAR_EOF > text.c
/*
Mklib 1.0 - a source file generator for Amiga shared libraries
Compiled with Manx v3.6a small code model/16 bit int. (see makefile)
copyright 1988 Edwin Hoogerbeets
This software and the files it produces are freely redistributable
as long there is no charge beyond reasonable copy fees and as long
as this notice stays intact.
Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this
program is lifted. Also thanks to Neil Katin for his mylib.asm upon
*/
#include <stdio.h>
#include <ctype.h>
#include <edlib.h>
char *makeheader[] = {
"# This makefile was generated with mklib",
"# copyright 1988 Edwin Hoogerbeets",
"#",
"# This software is freely redistributable as long as there is no charge",
"# beyond resonable copy fees and as long as this notice stays intact.",
"#",
"# Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
"# program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
"# which elib is based.",
"",
"CFLAGS=-T",
"",
NULL
};
char *makefooter[] = {
" ln $(OBJS) -lc -o $@",
"",
"#yourprog: yourprog.o link.o",
"# ln yourprog.o link.o -lc -o $@",
NULL
};
char *facemid[] = {
"",
" public _geta4",
"",
"myopen:",
" setup",
" push a6",
" jsr _myOpen",
" restore 4",
"",
"myclose:",
" setup",
" push a6",
" jsr _myClose",
" restore 4",
"",
"myexpunge:",
" setup",
" push a6",
" jsr _myExpunge",
" restore 4",
"",
NULL
};
char *asmheader[] = {
"; This file was generated with mklib",
"; copyright 1988 Edwin Hoogerbeets",
";",
"; This software is freely redistributable as long as there is no charge",
"; beyond resonable copy fees and as long as this notice stays intact.",
";",
"; Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
"; program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
"; which elib is based.",
";",
"",
NULL
};
char *cheader[] = {
"/*",
" This file was generated with mklib",
" copyright 1988 Edwin Hoogerbeets",
"",
" This software is freely redistributable as long as there is no charge",
" beyond resonable copy fees and as long as this notice stays intact.",
"",
" Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this",
" program is lifted. Also thanks to Neil Katin for his mylib.asm upon",
" which elib is based.",
"*/",
"",
NULL
};
char *startupcode[] = {
";:ts=8",
"; Copyright (C) 1986 by Manx Software Systems, Inc.",
";",
"",
"; *** But FUNKIFIED by jimm ***",
"; library base in D0",
"; segment list in A0",
"; execbase in A6",
"",
"; Initial startup routine for Aztec C.",
"",
"; NOTE: code down to \"start\" must be placed at beginning of",
"; all programs linked with Aztec Linker using small",
"; code or small data.",
"",
"",
"a4save dc.l 0",
"",
" public .begin ; just to resolve label",
".begin",
" public _funkyInit",
"_funkyInit:",
"",
" near code",
"",
" movem.l d0/d2/d3/d4-d7/a2-a6,-(sp)",
"",
" ; FUNKY use a0, not a1 for segment list",
" move.l a0,a4 ;BPTR to code seg",
" add.l a4,a4",
" add.l a4,a4 ;now real address of code seg",
"",
" move.l (a4),a4 ;indirect to get data segment BPTR",
" add.l a4,a4 ;convert to real pointer",
" add.l a4,a4 ;real address of data seg link field",
"",
" ; same as crt0.a68",
" add.l #32766+4,a4 ;bias appropriately (+4 is for link)",
" lea __H1_end,a1",
" lea __H2_org,a2",
" cmp.l a1,a2 ;check if BSS and DATA together",
" bne start ;no, don't have to clear",
" move.w #((__H2_end-__H2_org)/4)-1,d1",
" bmi start ;skip if no bss",
" move.l #0,d2",
"loop",
" move.l d2,(a1)+ ;clear out memory",
" dbra d1,loop",
"",
"start",
" lea a4save,a1 ;get address of a4save",
" move.l a4,(a1) ;save a4",
"; FUNKY",
"; move.l sp,__savsp ;save stack pointer (can't fexec)",
"; move.l 4,a6 ;get Exec's library base pointer",
" move.l a6,_SysBase ;put where we can get it",
"",
" movem.l d0/a0,-(sp) ; pass base and seglist",
" jsr _funkymain ; FUNKY",
" addq.l #8,sp ;pop args to funkymain()",
" ; can pop better (?)",
"",
" movem.l (sp)+,d0/d2/d3/d4-d7/a2-a6",
" rts ;and return",
"",
" public _geta4",
"_geta4:",
" move.l a4save,a4",
" rts",
"",
" dseg",
"",
"",
"_SysBase dc.l 0",
"",
" public _funkymain",
" public _SysBase",
" public __H1_end,__H2_org,__H2_end",
"",
" end",
NULL
};
char *rtag[] = {
"; rtag.asm -- romtag",
"",
" include 'exec/types.i'",
" include 'exec/resident.i'",
" include 'exec/nodes.i'",
" include 'exec/libraries.i'",
"",
"MYVERSION equ 1",
"MYPRI equ 0",
"",
" cseg ; romtag must be in first hunk",
"",
" public _myname",
" public _myid",
" public _myInitTab",
"",
" ds 0",
" public _myRomTag",
"_myRomTag:",
" dc.w RTC_MATCHWORD",
" dc.l _myRomTag",
" dc.l endtag",
" dc.b RTF_AUTOINIT",
" dc.b MYVERSION",
" dc.b NT_LIBRARY",
" dc.b MYPRI",
" dc.l _myname",
" dc.l _myid",
" dc.l _myInitTab",
"endtag:",
"",
" end",
NULL
};
char *mandatory[] = {
"/* created by jim mackraz using mylib.asm by neil katin",
" * may be used and distributed providing this comment block",
" * is retained in the source code",
" */",
"#include <stdio.h>",
"#include \"lib.h\"",
"",
"extern PFL libfunctab[]; /* my function table (libface.asm) */",
"extern LONG funkyInit(); /* hacked up version of Aztec crt0.a68 */",
"",
"LONG myExpunge();",
"",
"struct InitTable myInitTab = {",
" sizeof (struct MyBase),",
" libfunctab,",
" NULL, /* will initialize my data in funkymain() */",
" funkyInit",
"};",
"",
"#define MYREVISION 0 /* would be nice to auto-increment this */",
"",
"extern char myname[];",
"extern char myid[];",
"",
"extern struct Resident myRomTag;",
"",
"/*",
" * this function is my C-language library initRoutine. It is called",
" * by funkyInit() after register saves and small model initialization is",
" * done.",
" */",
"",
"LONG",
"funkymain(libbase, seglist)",
"struct MyBase *libbase;",
"ULONG seglist;",
"{",
" register struct MyBase *base;",
"",
" /* cookie */",
" base = libbase;",
" base->mb_Cookie = 0xDEAD1234; /* debug kind of stuff */",
" base->mb_SegList = seglist;",
"",
" /* init. library structure (since I don't do automatic data init.) */",
" base->mb_Lib.lib_Node.ln_Type = NT_LIBRARY;",
" base->mb_Lib.lib_Node.ln_Name = (char *) myname;",
" base->mb_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;",
" base->mb_Lib.lib_Version = myRomTag.rt_Version;",
" base->mb_Lib.lib_Revision = MYREVISION;",
" base->mb_Lib.lib_IdString = (APTR) myid;",
"",
" /* ----- do your own initialization here ----- */",
"}",
"",
"LONG",
"myOpen(base) /* baseptr in A6, version in D0 */",
"struct MyBase *base;",
"{",
" /* mark us as having another customer */",
" base->mb_Lib.lib_OpenCnt++;",
"",
" /* prevent delayed expunges (standard procedure) */",
" base->mb_Lib.lib_Flags &= ~LIBF_DELEXP;",
"",
" return ((LONG) base);",
"}",
"",
"LONG",
"myClose(base)",
"struct MyBase *base;",
"{",
" LONG retval = 0;",
"",
" if ((--base->mb_Lib.lib_OpenCnt == 0) &&",
" (base->mb_Lib.lib_Flags & LIBF_DELEXP))",
" {",
" /* no more people have me open,",
" * and I have a delayed expunge pending",
" */",
" retval = myExpunge(); /* return segment list */",
" }",
"",
" return (retval);",
"}",
"",
"LONG",
"myExpunge(base)",
"struct MyBase *base;",
"{",
" ULONG seglist = 0;",
" LONG libsize;",
"",
" if (base->mb_Lib.lib_OpenCnt == 0)",
" {",
" /* really expunge: remove libbase and freemem */",
"",
" seglist = base->mb_SegList;",
"",
" Remove(base);",
"",
" libsize = base->mb_Lib.lib_NegSize + base->mb_Lib.lib_PosSize;",
" FreeMem((char *) base - base->mb_Lib.lib_NegSize, (LONG) libsize);",
" }",
" else",
" {",
" base->mb_Lib.lib_Flags &= LIBF_DELEXP;",
" }",
"",
"",
" /* return NULL or real seglist */",
" return ((LONG) seglist);",
"}",
"",
NULL
};
char *faceheader[] = {
" include 'exec/types.i'",
"",
"setup macro",
" movem.l d2/d3/d4-d7/a2-a6,-(sp)",
" jsr _geta4",
" endm",
"",
"push macro",
" move.l \\1,-(sp)",
" endm",
"",
"fix macro",
" ifc '\\1',''",
" mexit",
" endc",
" ifle \\1-8",
" addq.l #\\1,sp",
" endc",
" ifgt \\1-8",
" lea \\1(sp),sp",
" endc",
" endm",
"",
"restore macro",
" fix \\1",
" movem.l (sp)+,d2/d3/d4-d7/a2-a6",
" rts",
" endm",
"",
" dseg",
"",
" public _libfunctab",
"_libfunctab:",
" dc.l myopen",
" dc.l myclose",
" dc.l myexpunge",
" dc.l $0000",
NULL
};
char *incbody[] = {
"#include <exec/types.h>",
"#include <exec/nodes.h>",
"#include <exec/resident.h>",
"#include <exec/libraries.h>",
"",
"#include <functions.h>",
"",
"typedef LONG (*PFL)(); /* pointer to function returning 32-bit int */",
"",
"/* library initialization table, used for AUTOINIT libraries */",
"struct InitTable {",
" ULONG it_DataSize; /* library data space size */",
" PFL *it_FuncTable; /* table of entry points */",
" APTR it_DataInit; /* table of data initializers */",
" PFL it_InitFunc; /* initialization function to run */",
"};",
"",
"struct MyBase {",
" struct Library mb_Lib;",
" ULONG mb_Cookie; /* looks good */",
" ULONG mb_SegList;",
" ULONG mb_Flags;",
" APTR mb_ExecBase; /* pointer to exec base */",
" APTR mb_A4; /* proper value of A4 for aztec small model */",
"};",
NULL
};
char *linkhead[] = {
" include 'exec/types.i'",
" include 'exec/libraries.i'",
"",
" LIBINIT",
NULL
};
char *link2[] = {
"",
"store macro",
" movem.l d2-d7/a2-a5,safekeep",
" endm",
"",
"retrieve macro",
" movem.l safekeep,d2-d7/a2-a5",
" endm",
"",
" dseg",
"",
"safekeep:",
" dcb.l 14 ; reserve some space for temporary register storage",
"",
" cseg",
"",
" ; --- xref from application",
" public _libbase",
"",
" ; --- xdef for application\n",
NULL
};
char *face2[] = {
" dc.l $ffffffff",
"",
" cseg",
"",
" ;--- library functions",
" public _myOpen",
" public _myClose",
" public _myExpunge",
NULL
};
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.